CMPSW Сравнение строк из слов

Флаги

O D I T S Z A P C
*       * * * * * 

Команда:

CMPSW

Логика:

CMP (DS:SI), (ES:DI) ; только устанавливает признаки
                 if DF = 0
                     SI = SI + 2
                     DI = DI + 2
                 else
                     SI = SI - 2
                     DI = DI - 2 

Эта команда сравнивает два значения, вычитая слово, на которое указывает ES:DI, из слова, на которое указывает DS:SI, и устанавливает флаг в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, SI и DI увеличиваются на 2, если флаг направления сброшен, или уменьшаются на 2, если флаг направления установлен. Тем самым подготавливаются к сравнению следующие элементы обеих строк.

Операнды Такт байты (слова)ОбращенияБайтыПример
нет операндов3021CMPSW
(повтор)9+30/rep 2/rep 1REPE CMPSW

Пусть имеют место следующие определения :

         buffer1 dw      50 dup  (?)
         buffer2 dw      50 dup  (?)

Тогда следующий пример выполняет сравнение элементов строк BUFFER1 и BUFFER2 до первого их несовпадения (mismatch):

cld               		;сканируя в прямом направлении
mov   cx, 50      		;50 слов (CX используется в REPE),
lea   si, buffer1 		;начиная с 1го элемента BUFFER1
lea   di, buffer2 		;и с 1го элемента BUFFER2,
repe   cmpsw             	;сравниваем их.
jne   mismatch    		;флаг ZF = 0, если сравниваемые
                                  	;строки не совпадают (mismatch)
match:                  	;если мы попали сюда, значит, они
                                 	;совпадают (match)
                      
mismatch:    
dec   si          		;если мы попали сюда, то мы нашли
dec   si          		;несовпадение, и возвращаем указатели

dec   di          		;SI и DI обратно, чтобы они указывали
dec   di          		;на первые несовпадающие слова.

После выхода из цикла REPE CMPSW флаг ZF будет сброшен, если несовпадение было найдено, и установлен в противоположном случае. Если несовпадение было найдено, то DI и SI будут указывать на слова (по два байта), следующие непосредственно за словами, которые не совпали; пары команд DEC DI и DEC SI уменьшают значения в этих регистрах таким образом, чтобы они указывали на сами несовпадающие слова.

Hosted by uCoz